/**  
* @Title: XunboExtractor.java
* @Package org.zsen.crawler
* @Description TODO
* @author ZhangSen
* @date 2015年11月2日 下午12:05:54
* @version 
*/
package org.zsen.crawler.xunbo;

import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.nodes.Element;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.zsen.crawler.util.JDBCHelper;
import org.zsen.crawler.util.XunboUrlEncoderUtils;
import org.zsen.crawler.xunbo.MovieInfo.DownLoadLink;

import cn.edu.hfut.dmic.webcollector.extract.Extractor;
import cn.edu.hfut.dmic.webcollector.extract.ExtractorParams;
import cn.edu.hfut.dmic.webcollector.model.Page;

/**
 * @ClassName: XunboExtractor
 * @Description:
 * @author ZhangSen
 * @date 2015年11月2日 下午12:05:54
 *
 */
public class XunboExtractor extends Extractor {

	public static final Logger LOG = LoggerFactory.getLogger(XunboExtractor.class);
	
	private MovieInfo movieInfo=new MovieInfo();
	private JdbcTemplate jdbc;
	/**
	 * Description: TODO
	 * 
	 * @param page
	 * @param params
	 */
	public XunboExtractor(Page page, ExtractorParams params) {
		super(page, params);
		jdbc=new JdbcTemplate(JDBCHelper.createConnection(XunboExtractor.class.toString(), 
				"jdbc:postgresql://127.0.0.1:5432/postgres", "postgres", "123456", 5, 10));
		
	}
	public JdbcTemplate getJDBC()
	{
		return jdbc;
	}
	public MovieInfo getInfo()
	{
		return movieInfo;
	}
	/**
	 * @Description: TODO
	 * @return
	 * @author ZhangSen
	 * @date 2015年11月2日 下午12:05:54
	 */
	@Override
	public boolean shouldExecute() {

		if(!Pattern.matches(".*电影.*", getDoc().select("div.wz").text())||Pattern.matches("http://www.xiamp4.com/play/.*", getUrl()))
			return false;
		else
		{
			return Pattern.matches(".*电影.*", getDoc().select("div.wz a").get(1).text());
		}
		
	}

	/**
	* @Description: TODO
	* @throws Exception
	* @author ZhangSen
	* @date 2015年11月2日 下午12:05:54      
	*/
	@Override
	public void extract() throws Exception {
		getInfo().title=getDoc().select("div.wz").text().replaceAll("(当前.+»  )", "").trim();
		getInfo().type=getDoc().select("div.wz a").text().replace("首页 电影 ", "").trim();
		String[] urls=getDoc().select("div.ndownlist > script:not([src])").toString().
				replaceAll("<script>var GvodUrls = |;|\"|</script>", "").split("###");
		for(String s:urls)
		{
			getInfo().setLinks(XunboUrlEncoderUtils.getNameByURL(s), s);
				
		}
		for(Element e:getDoc().select("div.info").select("ul").select("li"))
		{
			if(Pattern.matches(".*上映年代.*", e.text()))
			{
				Pattern p=Pattern.compile("([0-9]+)");
				Matcher m=p.matcher(e.text());
				if(m.find())
					getInfo().time=m.group().trim();
			}
			else if(Pattern.matches(".*主演.*", e.text()))
			{
				getInfo().actors=e.text().replace("主演：", "").trim();
			}
			else if(Pattern.matches(".*地区.*", e.text()))
			{
				getInfo().region=e.text().replace("地区：", "").trim();
			}
		}
		
		getInfo().drama=getDoc().select("div.endtext").text().trim();
	}

	/**
	 * @Description: TODO
	 * @throws Exception
	 * @author ZhangSen
	 * @date 2015年11月2日 下午12:05:54
	 */
	@Override
	public void output(){
		// TODO Auto-generated method stub
		
		try {
			String uuid=UUID.randomUUID().toString();
			String sql="insert into xunbo_movie_info(id,name,time,actors,region,type,drama) values('"+uuid+"','"+getInfo().title+"','"
					+ getInfo().time+"','"+getInfo().actors+"','"+getInfo().region+"','"+getInfo().type+"','"+getInfo().drama+"')";
			getJDBC().update(sql);
			for(DownLoadLink d:getInfo().getLinks())
			{
				String id=UUID.randomUUID().toString();
				sql="insert into xunbo_movie_link(id,movie_id,movie_name,link_name,link) values('"+id+"','"+uuid+"',"
						+ "'"+getInfo().title+"','"+d.getName()+"','"+d.getLink()+"')";
				getJDBC().update(sql);
			}
			System.err.println("write into the db success!");
		} catch (DataAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.err.println("##################################################\nSystem closed");
			System.exit(1);
		}
		getInfo().clear();
		
	}
	
	
}
